/*
 * De AI-speler, indien de menselijke speler codebreker wil zijn.
 */

package meesterbrein;

import java.util.Random;

/**
 *
 * @author Laurens van Dijk, s3012557 en Gerdriaan Mulder, s3048764
 */
public class aimaker extends Maker {

    public Model.Kleur[] aiSolution;
    private Model.Kleur[] lastCombination;

    /**
     * functie die een (pseudo)random code bedenkt die de menselijke speler mag kraken.
     */
    private void makeSolution()
    {
        aiSolution = new Model.Kleur[4];
        Random generator = new Random();
        int x;
        for(int i = 0; i < 4; i++) {
            x = generator.nextInt(6)+1;
           aiSolution[i] = Model.Kleur.numberedColour(x);
        }
        System.out.println("DEBUG: makeSolution() nomnom");
    }

  /*  public static void displaySolution()
    {
        for(int i = 0; i < 4; i++) {
            System.out.println(aiSolution[i]);
        }
    }

   *
   */

    /**
     * constructor, weinig over te zeggen verder.
     */
    public aimaker()
    {
        makeSolution();
     //   displaySolution();
    }

    /**
     * stel een aantal pinnen in.
     * @param p array van pinnen
     */
    public void vulPinDing(Model.Pin[] p) {
        for (int x=0; x<p.length; x++) {
            p[x] = Model.Pin.Niks;
        }
    }

    /**
     * doet een zet. Checkt voor overeenkomsten en zet bijhorende pinnetjes
     */
    public void doeStap() {
        lastCombination = Controller.getLastCombination();
        Model.Pin[] pinding = new Model.Pin[View.NUMPIECES];

        Model.Kleur[] beschikbareKleuren = new Model.Kleur[View.NUMPIECES];
        beschikbareKleuren = aiSolution.clone();

        vulPinDing(pinding);
        System.out.println("DEBUG: aimaker.doeStap(): vulPinDing done");

        // Scan voor gelijken, zowel op goede als verkeerde positie
        for (int z=0; z<lastCombination.length; z++) {

            for (int u=0; u<aiSolution.length; u++) {
                System.out.println(">>AI DEBUG: z="+z+":u="+u+", lastCombination[z]="+lastCombination[z]+", aiSolution[u]="+aiSolution[u]);
                if (u == z) {
                   if (aiSolution[u] == lastCombination[z]) {
                       pinding[z] = Model.Pin.Goed;
                       haalUitBeschikbareKleuren(beschikbareKleuren, aiSolution[u]);
                    }
                } else if (lastCombination[z] == aiSolution[u] && checkInBeschikbareKleuren(beschikbareKleuren, lastCombination[z])) {
                    pinding[z] = Model.Pin.Half;
                    System.out.println(">>AI DEBUG: (combi)-"+lastCombination[z]+" == "+aiSolution[u]+"-(ai)");
                }
            }
        }
        Controller.setPins(pinding);
        //Controller.volgendeSpeler();
    }
    /**
     * checkt of een bepaalde kleur in de kleurenarray zit
     * @param haystack kleurenarray om te doorzoeken
     * @param needle de speld in de hooiberg
     * @return true: zit erin, false: zit er niet in
     */
    private boolean checkInBeschikbareKleuren(Model.Kleur[] haystack, Model.Kleur needle) {
        boolean erin = false;
        for (int i=0; i<haystack.length;i++) {
            if (haystack[i] == needle) {
                erin = true;
            }
        }
        return erin;
    }

    /**
     * "verwijdert" een entry uit de hooiberg
     * @param haystack hooiberg om iets uit te halen
     * @param needle de spreekwoordelijke speld
     */
    private void haalUitBeschikbareKleuren(Model.Kleur[] haystack, Model.Kleur needle) {
        for (int i=0; i<haystack.length;i++) {
            if (haystack[i] == needle) {
                haystack[i] = Model.Kleur.Grijs;
            }
        }
    }

    /**
     * geef een Kleur terug aan de hand van de index
     * @param i indexgetal
     * @return iets uit de Kleur enum
     */
    public Model.Kleur getSolutionByIndex(int i) {
        if (i < aiSolution.length) {
            return aiSolution[i];
        }
        return Model.Kleur.Grijs;
    }
}
